package com.demo.jwt.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.UUID;

public class JwtUtil {

    //携带 token令牌的 hearder参数
    public static final String AUTH_HEADER_KEY = "Authorization";

    //设置 token 令牌参数的 key
    public static final String TOKEN_KEY = "token";

    //token 类型
    public static final String TOKEN_PREFIX = "Bearer ";

    //token加密密钥
    private static final String SECRET_KEY = "123456";

    private static final String ID = UUID.randomUUID().toString().replaceAll("-","");

    /**
     * 生成token
     * @param userId 用户id
     * @param username 用户名
     * @return token字符串
     */
    public static String getToken(String userId, String username){
        //设置 token 的过期时间, 单位 ms; 默认设置过期时间为 2 小时，即 2 * 60 * 60 * 60 * 1000
        long expTime = System.currentTimeMillis() + 2 * 60 * 60 * 60 * 1000;
        return Jwts.builder()
                .setId(userId)
                .setSubject(username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(expTime))
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    /**
     * 检验 token 是否有效
     * 有异常则表示检验失败，反之校验通过
     * @param token 令牌
     */
    public static Claims checkToken(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody();
    }

    /**
     * 解析token, 仅用于在token有效时获取token信息
     * @param token 字符串
     * @return token解析对象
     */
    public static Claims getClaims(String token){
        return Jwts.parser()
                   .setSigningKey(SECRET_KEY)
                   .parseClaimsJws(token)
                   .getBody();
    }

    public static void main(String[] args) {
        String token = getToken("a","tom");
        System.out.println(token);
        Claims claims = getClaims(token);
        System.out.println(claims.getId());
    }
}
